package database;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import models.MovementPorFondo;
import models.TimeValuePorFondo;

public class BDD {

	private static Statement sentencia;
	private static Connect conexion;	
	ResultSet resultado;

	private static void inicializaBDD(){
		conexion = new Connect();
		try {
			sentencia = conexion.getConexion().createStatement();
			sentencia.execute("USE finanzas");
		} catch (SQLException e) {
			System.out.println("ERROR: fallo al iniciar la base de datos");
			e.printStackTrace();
		}
	}
	
	

	public static void cierraAccesoBBDD() {
		conexion.cierraConexion();
		try {
			sentencia.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	
	//Espera valores validos, no los comprueba
	public static void addTimeValue(String name,int d, int m, int y,float value){
		try {
			String frase = String.format("%s '%s',%d,%d,%d,%s)", "insert into timevalues_fondos(nombrefondo, d, m, y, val) values(",name,d,m,y,value );
			sentencia.execute(frase);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static ArrayList<String> getNombresFondosConParticipaciones(){
		ArrayList<String> fondos = new ArrayList<String>();
		ResultSet resultado;
		
		//consulta a la base de datos
		try {
			resultado = sentencia.executeQuery(" select nombrefondo from fondos  where nombrefondo in(select nombrefondo from movimientos_fondos) order by nombrefondo");
			while(resultado.next()){
				String f = resultado.getString(1);
				fondos.add(f);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return fondos;
	}
	
	public static ArrayList<String> getNombresTodosFondos(){
		if(sentencia == null)
			inicializaBDD();
		
		ArrayList<String> fondos = new ArrayList<String>();
		ResultSet resultado;
		
		//consulta a la base de datos
		try {
			resultado = sentencia.executeQuery("select nombrefondo from fondos");
			while(resultado.next()){
				String f = resultado.getString(1);
				fondos.add(f);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return fondos;
	}
	
	public static ArrayList<TimeValuePorFondo> getTimeValuesPorFondo(String fondo){
		if(sentencia == null)
			inicializaBDD();
		
		ArrayList<TimeValuePorFondo> lista = new ArrayList<TimeValuePorFondo>();
		ResultSet resultado;
		
		//consulta a la base de datos
		try {
			resultado = sentencia.executeQuery("select d,m,y,val from timevalues_fondos where nombrefondo ='"+fondo+"' order by y,m,d;");
			
			while(resultado.next()){
				TimeValuePorFondo f = new TimeValuePorFondo(resultado.getInt(1),
						resultado.getInt(2),
						resultado.getInt(3),
						resultado.getFloat(4));
				lista.add(f);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return lista;		
	}
	
	public static ArrayList<MovementPorFondo> getMovementsPorFondo(String fondo){
		if(sentencia == null)
			inicializaBDD();
		
		ArrayList<MovementPorFondo> lista = new ArrayList<MovementPorFondo>();
		ResultSet resultado;
		
		//consulta a la base de datos
		try {
			resultado = sentencia.executeQuery("select d,m,y,num from movimientos_fondos where nombrefondo ='"+fondo+"' order by y,m,d;");
			
			while(resultado.next()){
				MovementPorFondo f = new MovementPorFondo(resultado.getInt(1),
						resultado.getInt(2),
						resultado.getInt(3),
						resultado.getFloat(4));
				lista.add(f);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return lista;		
	}
}
